package com.itheima.stock.controller;

import com.itheima.stock.pojo.domain.*;
import com.itheima.stock.service.StockService;
import com.itheima.stock.vo.resp.PageResult;
import com.itheima.stock.vo.resp.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;

/**
 * @author by itheima
 * @Date 2021/12/19
 * @Description
 */
@RestController
@RequestMapping("/api/quot")
public class StockController {

    @Autowired
    private StockService stockService;

    /**
     * 获取国内最新大盘指数
     *
     * @return
     */
    @GetMapping("/index/all")
    public R<List<InnerMarketDomain>> getInnerMarketInfo() {
        return stockService.getInnerMarketInfo();
    }

    /**
     * 需求说明: 获取沪深两市板块最新数据，以交易总金额降序查询，取前10条数据
     *
     * @return
     */
    @GetMapping("/sector/all")
    public R<List<StockBlockDomain>> sectorAll() {
        return stockService.sectorAllLimit();
    }

    /**
     * 分页查询股票最新数据，并按照涨幅排序查询
     *
     * @param page
     * @param pageSize
     * @return
     */
    @GetMapping("/stock/all")
    public R<PageResult<StockUpdownDomain>> getStockPageInfo(@RequestParam(name = "page", required = false, defaultValue = "1") Integer page,
                                                             @RequestParam(name = "pageSize", required = false, defaultValue = "20") Integer pageSize) {
        return stockService.getStockPageInfo(page, pageSize);
    }

    /**
     * 统计沪深两市个股最新交易数据，并按涨幅降序排序查询前4条数据
     *
     * @return
     */
    @GetMapping("/stock/increase")
    public R<List<StockUpdownDomain>> getStockIncreaseInfo() {
        return stockService.getStockIncreaseInfo();
    }

    /**
     * 统计最新交易日下股票每分钟涨跌停的数量
     *
     * @return
     */
    @GetMapping("/stock/updown/count")
    public R<Map<String, List>> getStockUpdownCount() {
        return stockService.getStockUpdownCount();
    }

    /**
     * 将指定页的股票数据导出到excel表下
     *
     * @param response
     * @param page     当前页
     * @param pageSize 每页大小
     */
    @GetMapping("/stock/export")
    public void stockExport(HttpServletResponse response,
                            @RequestParam(name = "page", required = false, defaultValue = "1") Integer page,
                            @RequestParam(name = "pageSize", required = false, defaultValue = "20") Integer pageSize) {
        stockService.stockExport(response, page, pageSize);
    }

    /**
     * 功能描述：统计国内A股大盘T日和T-1日成交量对比功能（成交量为沪市和深市成交量之和）
     *
     * @return
     */
    @GetMapping("/stock/tradeAmt")
    public R<Map<String, List>> stockTradeVol4InnerMarket() {
        return stockService.stockTradeVol4InnerMarket();
    }

    /**
     * 查询当前时间下股票的涨跌幅度区间统计功能
     * 如果当前日期不在有效时间内，则以最近的一个股票交易时间作为查询点
     *
     * @return
     */
    @GetMapping("/stock/updown")
    public R<Map> getStockUpDown() {
        return stockService.stockUpDownScopeCount();
    }

    /**
     * 功能描述：查询单个个股的分时行情数据，也就是统计指定股票T日每分钟的交易数据；
     * 如果当前日期不在有效时间内，则以最近的一个股票交易时间作为查询时间点
     *
     * @param code 股票编码
     * @return
     */
    @GetMapping("/stock/screen/time-sharing")
    public R<List<Stock4MinuteDomain>> stockScreenTimeSharing(@RequestParam(value = "code") String code) {
        return stockService.stockScreenTimeSharing(code);
    }


    /**
     * 单个个股日K 数据查询 ，可以根据时间区间查询数日的K线数据
     *
     * @param stockCode 股票编码
     */
    @RequestMapping("/stock/screen/dkline")
    public R<List<Stock4EvrDayDomain>> getStockScreenDkLine(@RequestParam("code") String stockCode) {
        return stockService.stockScreenDkLine(stockCode);
    }

    /**
     * 外盘数据展示
     *
     * @return
     */
    @GetMapping("/external/index")
    public R<List<OutMarketDomain>> getOutMarketIndex() {
        return stockService.getOutMarketIndex();
    }

    /**
     * 根据输入的个股代码，进行模糊查询，返回证券代码和证券名称
     *
     * @param searchStr （只接受代码模糊查询，不支持文字查询）
     * @return
     */
    @GetMapping("/stock/search")
    public R<List<Map>> stockSearchObscure(@RequestParam("searchStr") String searchStr) {
        return stockService.stockSearchObscure(searchStr);
    }

    /**
     * 个股主营业务查询接口
     *
     * @param code 股票编码
     * @return
     */
    @GetMapping("/stock/describe")
    public R<StockBusinessDomain> stockDescribe(@RequestParam("code") String code) {
        return stockService.stockDescribe(code);
    }

    /**
     * 单个个股周K 数据查询 ，统计每周内的股票数据信息，信息包含：
     * 股票ID、 一周内最高价、 一周内最低价 、周1开盘价、周5的收盘价、
     * 整周均价、以及一周内最大交易日期（一般是周五所对应日期）;
     *
     * @param stockCode
     * @return
     */
    @GetMapping("/stock/screen/weekkline")
    public R<List<Stock4EvrWeekDomain>> getWeekKLinData(@RequestParam(value = "code", required = true) String stockCode) {
        return stockService.stockScreenWkLine(stockCode);
    }

    /**
     * 获取个股最新分时行情数据，主要包含：
     * 开盘价、前收盘价、最新价、最高价、最低价、成交金额和成交量、交易时间信息;
     *
     * @param code
     * @return
     */
    @GetMapping("/stock/screen/second/detail")
    public R<StockSecondDetailDomain> stockScreenSecondDetail(@RequestParam(value = "code", required = true) String code) {
        return stockService.stockScreenSecondDetail(code);
    }

    /**
     * 个股交易流水行情数据查询--查询最新交易流水，按照交易时间降序取前10
     *
     * @param code 股票编码
     * @return
     */
    @GetMapping("/stock/screen/second")
    public R<List<StockScreenSecondDomain>> stockScreenSecond(@RequestParam("code") String code) {
        return stockService.stockScreenSecond(code);
    }
}